<?php
/**
 * User: Administrator
 * Date: 13-6-30
 * Time: 下午1:35
 * 权限验证类
 */
abstract class OauthAction extends CommonAction{
    public function _initialize(){
        parent::_initialize();
    }

    /**
     * 查找用户信息
     * @param $map
     * @param string $model
     * @return mixed
     */
    public static function getAuthinfo($map, $model='Master') {
        if(empty($model)) $model =  ucfirst(C('USER_AUTH_MODEL'));
        //使用给定的Map进行认证
        return M($model)->where($map)->find();
    }

    /**
     * 开始验证系统权限
     */
    public static function  accessAuth(){
        //检查当前操作是否需要认证
        if(self::checkAccess()){
            //检查认证识别号
            if(!$_SESSION[C('USER_AUTH_KEY')]) {
                redirect(PHP_FILE . C('USER_AUTH_GATEWAY'));
            }else{
                self::AccessDecision();
            }
        }
    }

    /**
     * 验证操作权限
     * @return bool
     */
    public static function AccessDecision(){
        return false;
    }

    //用于检测用户权限的方法,并保存到Session中
    public static function saveAccessList($authId) {
        $_SESSION[C('USER_AUTH_KEY')] = $authId;
        //查找权限列表
        if(!$_SESSION['_ACCESS_LIST'] )
            $_SESSION['_ACCESS_LIST'] = self::getAccessList($authId);
    }

    /**
     * 获取可操作菜单
     * @param $authId
     * @return array
     */
    public static function getAccessList($authId){
        $roleId = M('RoleShift')->where("manager_id = $authId")->getField('group_concat(role_id)');
        $accesslist = array(1);
        if(!empty($roleId)){ //查找角色中的菜单ID
            $roleMenu = M('Role')->where("role_id in ($roleId)")->getField('group_concat(menu_list)');
            if(!empty($roleMenu)){
                $roleMenu = explode(',', $roleMenu);
                foreach($roleMenu as $menu_id){
                    array_push($accesslist, $menu_id);
                }
            }
        }

        //查找另外分给管理员的菜单ID
        $menuList = M('MenuShift')->field('menu_id')->where("manager_id = $authId")->select();
        foreach($menuList as $row){
            array_push($accesslist, $row['menu_id']);
        }

        if(!empty($accesslist)){
            $accesslist = array_unique($accesslist);
            $menuList = M('Menu')->where(array('menu_id' => array('in', $accesslist)))->order('sort desc')->select();
            foreach($menuList as $row){
                $accesslist[$row['menu_id']] = $row;
            }
        }

        return $accesslist;
    }

    /**
     * 判断是否需要验证
     * @return bool
     */
    public static function checkAccess(){
        if(!C('USER_AUTH_ON')) return false;
        if(self::checkModule() && self::checkAction()) return true;
        return false;
    }

    /**
     * 判断是否需要验证当前模块
     * @return bool
     */
    protected static function checkModule(){
        $_module = explode(',', str_replace(' ', '', strtoupper(C('NOT_AUTH_MODULE')))); //不需要验证的模块
        //检查当前模块是否需要认证，如果当前模块在不需要验证的模块列表中，则返回false
        if(in_array(strtoupper(MODULE_NAME), $_module)) return false;
        return true;
    }

    /**
     * 判断是否需要验证方法
     * @return bool
     */
    protected static function checkAction(){
        $_action = explode(',', str_replace(' ', '', strtoupper(C('NOT_AUTH_ACTION')))); //不需要验证的操作
        if(in_array(strtoupper(ACTION_NAME), $_action)) return false;
        return true;
    }

    /**
     * 设置不需要验证的操作，只在模块中使用
     * @param $value
     * @param string $type
     * @return bool
     */
    public static function setAuth($value, $type = '+'){
        if(empty($value)) return false;
        if(is_string($value)) $value = explode(',', str_replace(' ', '', $value));
        $_action = explode(',', str_replace(' ', '', C('NOT_AUTH_ITEM')));
        switch($type){
            case '+':
                foreach($value as $item){
                    array_push($_action, $item);
                }
                break;
            case '-':
                foreach($value as $item){
                    unset($_action[$value]);
                }
                break;
        }
        C('NOT_AUTH_ITEM', join(',', $_action));
        return true;
    }
}